﻿// Inner Fire 游戏引擎库
// CameraObject - 摄像机对象
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于游戏的摄像机。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-25

#pragma once

#include <dx/mesh/render_item.h>
#include <dx/mesh/skin_animator.h>
#include <dx/view/dx_camera.h>
#include <game/object/game_object.h>
#include <game/resource/model.h>
#include <game/object/transform.h>

namespace ifire::game {
class CameraObject : public GameObject {
public:
  CameraObject(ikit::sstr name, Scene* scene, GameObject* parent = nullptr);
  CameraObject(const CameraObject& lhs) = delete;
  CameraObject& operator=(const CameraObject& lhs) = delete;
  ~CameraObject() override;

  // 覆盖
  void FixedUpdate() override;
  // 更新Transform
  //void UpdateTransform() override;

  // 设置相机的参数（FOV是角度）
  void SetCameraParam(float fov, float near_z, float far_z);
  // 设置相机的角度，并且根据相机的角度，计算相机的旋转
  void SetCameraRotation(float pitch, float yaw, float roll);
  // 设置相机的追踪对象
  void SetFollow(Transform* transform);
  // 更新追踪对象
  void UpdateFollow();
  // 设置位移
  void SetOffset(const DirectX::XMFLOAT3& offset);
  // 将一个输入的坐标，转换为一个方向向量
  XMFLOAT3 TransformAxis(const DirectX::XMFLOAT2& axis) const;

  // 通过pitch,yaw,roll计算方向四元数
  DirectX::XMVECTOR GetOrientationQuaternion() const;

  //
  // 属性访问
  //

private:
  // 引用自系统中的Camera
  dx::DxCamera* camera_;
  // 追踪对象
  Transform* follow_;
  // 位移
  XMFLOAT3 offset_;
  // 最终计算Follow的位置
  XMFLOAT3 look_position_;
  // 最终计算Follow的方法
  XMFLOAT4 look_rotation_;

  // Pitch（俯仰角=X）
  float pitch_ = 0.0;
  // Yaw（偏航角=Y）
  float yaw_ = 0.0;
  // Roll（横滚角=Z），这个几乎不会有变化，只是规范一个
  float roll_ = 0.0;
};

} // namespace ifire::game